#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main()
{
    //非阻塞轮询
    
    pid_t id = fork();
    if(id == 0)
    {
        //child
        printf("child pid:%d, ppid:%d\n", getpid(), getppid());
        //测试异常
        //int* p = NULL;
        //*p = 1;
        sleep(10);
        exit(1);
    }
    else if(id > 0)
    {
        int status;
        //father
        while(1)
        {
            pid_t ret = waitpid(id, &status,WNOHANG);
            if(ret == id)
            {
                if(WIFEXITED(status))
                {
                    //正常结束
                    printf("wait success, exit code:%d\n", WEXITSTATUS(status));
                    break;
                }
            }
            else if(ret < 0)
            {
                //异常
                printf("wait fail,%s\n",strerror(status & 0x7f));
                break;
            }
            else
            {
                //子进程还在执行
                printf("child running,wait a minute\n");
                sleep(1);
            }
        }
    }

   // //阻塞轮询
   // for(int i = 0; i < 5; i++)
   // {
   //     pid_t id = fork();
   //     if(id == 0)
   //     {
   //         printf("child pid:%d\n", getpid());
   //         sleep(1);
   //         exit(0);
   //     }
   // }

   // sleep(5);

   // int status = 0;
   // for(int i = 0; i < 5; i++)
   // {
   //     pid_t ret = waitpid(-1, &status, 0);
   //     if(ret > 0)
   //     {
   //         printf("wait success pid:%d\n", ret);
   //         sleep(1);
   //     }
   // }
   // sleep(5);
    return 0;
}
